package com.example.clientmiviamoviego4;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;




/**
 * Classe che gestisce la connessione al server MiviaMovieServer. Il server puo'
 * restituire nel body della risposta degli XML che verranno opportunatamente
 * convertiti in oggetti Java.
 * 
 * @author Gang of Four
 * */
public class HandleConnection {

	private String key = "";
	
	/**
	 * Oggetto indicante l'operazione da effettuare all'atto di una richiesta al
	 * server.
	 * */
	private OperationEnum operation;
	
	/**
	 * Stringa indicante l'URL per la connessione al server.
	 * */
	private String urlString = null;
	
	/**
	 * Stringa indicante l'URL base del server, dove viene indicato l'indirizzo
	 * IP e la porta di ascolto del server.
	 * */
	public String basePath;

	/**
	 * Oggetto utilizzato per il parsing dei file XML e delle classi
	 * 
	 * */
	MyParser parser;
	
	/**
	 * Costruttore della classe HandleConnection
	 * 
	 * @param basePath
	 *            Indirizzo IP e la porta di ascolto del server.
	 * @param url
	 *            Parte finale dell'URL usato per la connessione al server.
	 * @param operation
	 *            Operazione da effettuare all'atto di una richiesta al server.
	 * */
	public HandleConnection(String basePath, String url, OperationEnum operation) {
		this.urlString = url;
		this.operation = operation;
		this.basePath = basePath;
		this.parser = new MyParser(basePath);
	}

	public String getKey() {
		return key;
	}

	/**
	 * Get dei risultati ottenuti dalla risposta del server.
	 * */
	public Object getArrayList() {
		return (Object) parser.getResult();
	}



	/**
	 * 
	 * Metodo di gestione di una richiesta al server di tipo GET.
	 * */
	public int doGet() {
		int status = 0;
		parser = new MyParser(basePath);
		
		try {
			URL url = new URL(basePath + urlString);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(5000 /* milliseconds */);
			conn.setConnectTimeout(5000 /* milliseconds */);
			conn.setRequestMethod("GET");
			conn.setDoInput(true);
			conn.connect();

			status = conn.getResponseCode();

			InputStream stream = conn.getInputStream();
			
			parser.parseXMLAndStoreIt(stream, operation);
			
			status = conn.getResponseCode();
			stream.close();
			
		} catch(FileNotFoundException e){
			status = -2;
		} catch (Exception e) {
			e.printStackTrace();
			status = -1;
		}
		return status;
	}

	/**
	 * Metodo di gestione di una richiesta al server di tipo POST, nello
	 * specifico inerente alla trasmissione dei generi scelti dall'utente
	 * all'atto della selezione delle sue preferenze.
	 * */
	public int doPost(ArrayList<ParcelableMovieType> listMovies) {
		String stringListMovies;
		int status = 0;
		
		try {
			stringListMovies = parser.getXMLFromListMovieType(listMovies);
			URL url = new URL(basePath + urlString);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(5000 /* milliseconds */);
			conn.setConnectTimeout(5000 /* milliseconds */);
			conn.setRequestProperty("Content-Type", "application/xml");
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			OutputStreamWriter wr = new OutputStreamWriter(
					conn.getOutputStream());
			wr.write(stringListMovies);
			wr.flush();
			wr.close();
			status = conn.getResponseCode();
		} catch (Exception e) {
			e.printStackTrace();
			status = -1;
		}
		return status;
	}

	/**
	 * Metodo di gestione di una richiesta al server di tipo PUT, nello
	 * specifico inerente alla registrazione di un nuovo utente.
	 * */
	public int doPut(User user) {
		int status = 0;
		String stringUser;
		
		try {
			
			stringUser = parser.getXmlFromObject(user, OperationEnum.PUT_USER);

			URL url = new URL(basePath + urlString);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(5000 /* milliseconds */);
			conn.setConnectTimeout(5000 /* milliseconds */);
			conn.setRequestProperty("Content-Type", "application/xml");
			conn.setRequestMethod("PUT");
			conn.setDoOutput(true);
			OutputStreamWriter wr = new OutputStreamWriter(
					conn.getOutputStream());
			wr.write(stringUser);
			wr.flush();
			wr.close();
			status = conn.getResponseCode();

		} catch (Exception e) {
			e.printStackTrace();
			status = -1;
		}
		return status;
	}

	
}
